<?php

namespace app\utils\script;

use app\utils\ui\vue\VueVarValue;

/**
 * 跳页操作的代码
 */
class JumpHrefScript implements JSScript{
    private $txt = '';
    private $arg = '';
    /**
     * 跳页（vue） JS代码
     * @param array $filter_var 忽略某些字段, ['a','b','c']
     * @param array $var 包含某些字段，若此信息不为空那么filter_var 将在此选取某些字段或略
     * @param array $other [ key=>val] 其他参数 额外query参数，支持vue变量
     * @param string $arg 函数体的传参
     */
    public function __construct($url,$filter_var=null,$var=null,$other=[],$arg='event')
    {
        $this->arg= $arg;
        $list='[]';
        $list2='[]';
        if($filter_var){
            $list = json_encode($filter_var,JSON_UNESCAPED_UNICODE);
            if($list===$filter_var || $list===false){
                $list='[]';
            }
        }
        if($var){
            $list2 = json_encode($var,JSON_UNESCAPED_UNICODE);
            if($list2===$filter_var || $list2===false){
                $list2='[]';
            }
        }
        if(count($other)>0){
            $sp =[];
            foreach($other as $k=>$v){
                if($v instanceof VueVarValue){
                    $v= '"+'.($v->var ? $v->var : $v->val).'+"';
                    $sp[]=$k.'='.$v;
                }else{
                    $sp[]=$k.'='.urlencode($v);
                }
            }
            $other = implode('&',$sp);
            $other='
            query.push("'.$other.'");
            ';
        }else{
            $other='';
        }
        $this->txt='
        let query = []
        let list = '.$list.';
        let list2 = '.$list2.';
        for(let n in current_app){
            if(typeof current_app[n] == "function"){
                continue;
            }
            if(list2.length>0){
                if(list2.indexOf(n)!=-1){
                    if(list.indexOf(n)==-1){
                        query.push(n+"="+encodeURIComponent(current_app[n]))
                    }
                }
            }else{
                if(list.indexOf(n)==-1){
                    query.push(n+"="+encodeURIComponent(current_app[n]))
                }
            }
        }
        '.$other.'
        let query2 = query.join("&")
        location.href="'.$url.'?"+query2
        ';
    }
    public function text(){
        return $this->txt;
    }
    public function argv(){
        return '('.$this->arg.')';
    }
}